<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // 递归:传递与回归   ----- 


        // 1 打印n个666

        // 普通做法
        //    使用一个计数器  i   打印一次就统计一次    
        // function fn(n) {
        //     for(var i = 0 ; i < n ; i++) {
        //         console.log(666);
        //     }
        // }

        // 递归做法
        //    功能：打印666
        //    打印一次少一次   反着   
        //    出口   到0就结束 
       function fn(n) {
        if(n === 0) return ;
          console.log(666);
          fn(n-1);
       }

        fn(10);




        // 2 求阶乘   n! = 1 * 2 * 3 * 4 * ... * n  
        //   核心功能  乘积
        //   思路： 
        //      计算n的阶乘   jc(n)
        //      结果  jc(n) =  jc(n-1) * n
        //      反着去计算的过程

        function jc(n) {
            if(n === 1) return 1
            return jc(n - 1) * n ;
        }


        // 5的阶乘  jc(5) = jc(4) * 5
        //          jc(4) = jc(3) * 4
        //          jc(3) = jc(2) * 3
        //          jc(2) = jc(1) * 2
        //          jc(1) = 1



        // 发现：
        //   反着
        //   一定会有出口
        //   如果计算一个结果  就一定要写return 



        // 计算： 1 + 1/2 + 1/3 + 1/4 + ...

        // function sum(n) {
        //     if(n === 1) return 1
        //     return sum(n-1) + 1 / n ;
        // }

        // 计算： 1 - 1/2 + 1/3 - 1/4 + ...
        //   1 + (-1/2) + (1/3) + (-1/4) 

        // function sum(n) {
        //     // return sum(n-1) + +-1 / n
        //     if(n === 1) return 1 ;
        //     var i = n % 2 ? 1 : -1 ;
        //     return sum(n-1) + i / n ;
        // }

        
        // 计算  
        //   奇数  1 + 1/3 + 1/5 + 1/7 ...
        //   偶数  1/2 + 1/4 + 1/6 ...

        // 奇数的计算  1 + 1/3 + 1/5 + 1/7 ...
        // function sum(n) {
        //     // 1/7 + 前面的1-1/5 

        //     if(n === 1) return 1
        //     return 1 / n + sum(n - 2) ;
        // }
        

        
        // // 偶数的计算  1/2 + 1/4 + 1/6 ...
        // function sum(n) {
        //     // 1/6 + 前面的1-1/4

        //     if(n === 2) return 1/2
        //     return 1 / n + sum(n - 2) ;
        // }


        // 整合
        // function sum(n) {
        //     if(n === 1) return 1 ;
        //     if(n === 2) return 1 / 2 ;
        //     return 1 / n + sum(n - 2) ;
        // }

        function sum(n) {
            if(n <= 2) return 1 / n ;
            return 1 / n + sum(n - 2) ;
        }
        
        

        // 随机验证码
        //    产生随机数   拼接
        //    5位   你产生前四位  我再产生一位  然后拼接
        //    randCode(5)   randCode(4) + rand

        function randCode(n) {
            if(n === 0) return ''
            var a = parseInt(Math.random() * 10) ;
            return randCode(n - 1) + a ;
        }


        // document.write(randCode(4));



        // 倒三角形
        // ******
        // *****
        // ***
        // **
        // *

        function sjx(n) {
            if(n === 0) return
            // 打印星星

            function star(m) {
                if(m === 0) return 
                document.write('*') ;
                star(m - 1) ;
            }

            star(n);



            // 打印换行
            document.write('<br>') ;
            sjx(n - 1) ;
        }

        sjx(5);




    </script>
    
</body>
</html>